home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
editor
/
proged10.lha
/
InstallProgED
/
sources
/
PED_Scan
/
ScanFunction.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-24
|
3KB
|
129 lines
/***** Include vari *****/
#include "ProgED:sources/include/Ped.h"
#include <string.h>
/*****
*
* FUNZIONE: ULONG SAVEDS ASM main(char *line,char *sectionname)
*
* SCOPO: Cerca un riferimento ad una funzione C nella linea puntata
* da "line". Il nome della funzione viene copiato in
* "sectionname". Dipendentemente dal modo di scrivere
* programmi questo scanner puo' fallire nel suo scopo.
* Ho scritto questo scanner secondo il MIO modo di
* scrivere funzioni. Se il vostro modo e' diverso dal mio
* scrivetene uno vostro o migliorate questo.
*
* NOTA: Utilizza SEMPRE la funzione geta4() o la direttiva __saveds!
*
* RESTITUISCE: Lunghezza della stringa copiata in "sectionname".
* 0=riferimento non trovato.
*
****/
ULONG SAVEDS ASM main(RG(a0) char *line,RG(a1) char *sectionname)
{
char *p,
*q,
*d,
*r;
int i,
n1,
n2;
/***** Se la linea inizia per 'static ' saltalo *****/
if ((line[0]=='s')||(line[0]=='S'))
if ((line[1]=='t')||(line[1]=='T'))
if ((line[2]=='a')||(line[2]=='A'))
if ((line[3]=='t')||(line[3]=='T'))
if ((line[4]=='i')||(line[4]=='I'))
if ((line[5]=='c')||(line[5]=='C'))
if ((line[6]==32)||(line[6]==9))
line+=7;
/***** Se la linea inizia per 'struct ' saltalo *****/
if (line[0]=='s')
if (line[1]=='t')
if (line[2]=='r')
if (line[3]=='u')
if (line[4]=='c')
if (line[5]=='t')
if (line[6]==32)
line+=7;
/***** Controlla che sulla linea ci siano UNA '(' ed UNA ')' *****/
p=line;
n1=n2=0;
while(*p)
{
if (*p=='(') n1++;
if (*p==')')
{
r=p+1;
n2++;
}
p++;
}
/****** Se c'e' una '(' ma nessuna ')' forse la definizione e' su piu' linee
in tal caso controlla che la linea finisca per ','! *****/
if ((n1==1)&&(!n2))
{
if (line[strlen(line)-1]==',')
{
r=line+strlen(line);
n2=1;
}
}
/****** Continua solo se c'era solo una '(' ed una ')' *****/
if ((n1!=1)||(n2!=1)) return(0);
/***** In caso positivo -> controlla che la ')' non sia seguita da altro (al massimo ';') *****/
p=r;
while(*p)
{
if ((*p!=32)&&(*p!=9)&&(*p!=';')) break;
p++;
}
if (*p) return(0);
/****** OK! Controlla che la linea sia del tipo xxxx xxxx(.... *****/
q=p=line;
n1=0;
while(*p)
{
if ((*p==32)||(*p==9))
{
q=p+1;
n1++;
}
if (*p=='(') break;
p++;
}
if (n1>1) return(0);
if (n1==1) if (q==line+1) return(0);
/***** Se il tipo di ritorno e' un puntatore elimina l'asterisco *****/
if (*q=='*') q++;
/***** Copia il nome e ritorna *****/
d=sectionname;
for(i=0;i<p-q;i++) *d++=q[i];
*d='\0';
return(p-q);
}